// 引入 Pinia 的 defineStore 方法，用于创建状态存储（store）
import { defineStore } from 'pinia'

// 引入封装好的登录和登出 API 请求函数
import { login, logout } from '../services/auth'

// 引入 Vue Router 实例，用于页面跳转
import router from '../router'

/**
 * 创建名为 'auth' 的 Pinia Store，用于管理用户认证状态
 */
export const useAuthStore = defineStore('auth', {
  /**
   * 状态定义（state）
   * 存储用户的 token 和 user 信息，并尝试从 localStorage 中恢复数据
   */
  state: () => ({
    // 从 localStorage 获取 token，若不存在则为 null
    token: localStorage.getItem('token') || null,

    // 从 localStorage 解析用户信息，若不存在则为 null
    user: (() => {
      const userStr = localStorage.getItem('user');
      try {
        return userStr ? JSON.parse(userStr) : null;
      } catch (error) {
        console.error('Failed to parse user data:', error);
        return null;
      }
    })(),
  }),

  /**
   * 计算属性（getters）
   * 提供基于 state 的派生状态
   */
  getters: {
    /**
     * 判断用户是否已登录
     * @param {Object} state - 当前 store 的 state
     * @returns {boolean} - 是否已认证
     */
    isAuthenticated: (state) => !!state.token,
  },

  /**
   * 动作方法（actions）
   * 执行异步操作，如登录、登出等
   */

  actions: {
    /**
     * 用户登录方法
     * 发起登录请求并保存 token 和用户信息
     * @param {Object} credentials - 包含用户名和密码的对象
     * @returns {Promise<boolean>} - 登录是否成功
     */
    async loginUser(credentials) {
      try {
        // 调用登录接口，发送用户名和密码
        const response = await login(credentials)

        // 保存 token 和用户信息到 Pinia store
        this.token = response.data.data.token
        this.user = response.data.data

        // 持久化：将 token 和用户信息存入 localStorage
        if (this.token) {
          localStorage.setItem('token', this.token);
        } else {
          localStorage.removeItem('token');
        }

        if (this.user) {
          localStorage.setItem('user', JSON.stringify(this.user));
        } else {
          localStorage.removeItem('user');
        }

        // 跳转到 Dashboard 页面
        router.push({ name: 'Dashboard' })

        // 返回 true 表示登录成功
        return true
      } catch (error) {
        // 捕获异常并打印错误信息
        console.error('登录失败:', error)

        // 返回 false 表示登录失败
        return false
      }
    },

    /**
     * 用户登出方法
     * 清除 token 和用户信息，并跳转回登录页
     */
    async logoutUser() {
      try {
        // 调用登出接口（可选）
        await logout()
      } catch (error) {
        // 若接口调用失败，打印错误信息
        console.error('登出失败:', error)
      } finally {
        // 无论是否调用成功，都执行以下清理操作

        // 清空 store 中的 token 和用户信息
        this.token = null
        this.user = null

        // 移除 localStorage 中的 token 和用户信息
        localStorage.removeItem('token')
        localStorage.removeItem('user')

        // 跳转回登录页
        router.push({ name: 'Login' })
      }
    },
  },
})